#pragma once

#include <metalc/cls/_cls.h>
// DECL_SZLCS(pow2b)


#define __sz2cls_pow2b(size, bits_min)		(next_pow2_bit(size) - (bits_min))
#define __cls2sz_pow2b(cls, bits_min)		(BIT(cls + (bits_min)))
#define __clsnr_pow2b(bits_min, bits_max)	((bits_max) - (bits_min))
// int a[__sz2cls_pow2b(302672, 15 + 1)];

#define DEF_CLS_POW2B(name, LOG2_MINSZBIT, LOG2_MAXSZBIT)		\
DECL_SZLCS(name)							\
SASSERT(LOG2_MAXSZBIT > LOG2_MINSZBIT);					\
static const szcls_t _clsnr_##name = __clsnr_pow2b(LOG2_MINSZBIT, LOG2_MAXSZBIT);\
static const size_t _maxsz_##name = __cls2sz_pow2b(_clsnr_##name - 1, LOG2_MINSZBIT);\
SAI PURE szcls_t _sz2cls_##name (size_t size){ return __sz2cls_pow2b(size, LOG2_MINSZBIT); };\
SAI PURE size_t _cls2sz_##name (szcls_t cls){ return __cls2sz_pow2b(cls, LOG2_MINSZBIT); };





// SAI PURE szcls_t __sz2cls_pow2b(const size_t min_size, const size_t max_size, size_t size){
    
//     szcls_t szl = log2_align(log2_roundup(size));
//     /* 应该假设已经align了 */
//     // if(!is_powerof2(size)) szl += 1;
//     szcls_t cls = szl - log2_align(min_size);
//     return cls;
// }

// SAI PURE size_t __cls2sz_pow2b(const size_t min_size, const size_t max_size, szcls_t cls){
//     return ((size_t)1UL) << (cls + log2_align(min_size)); 
// }


